# This file is in the public domain.

_arch_compgen() {
  local i r
  COMPREPLY=($(compgen -W '$*' -- "$cur"))
  for ((i = 1; i < ${#COMP_WORDS[@]} - 1; i++)); do
    for r in ${!COMPREPLY[@]}; do
      if [[ ${COMP_WORDS[i]} == ${COMPREPLY[r]} ]]; then
        unset 'COMPREPLY[r]'
        break
      fi
    done
  done
}

_arch_ptr2comp() {
  local list= x y
  for x; do
    for y in '0 --' '1 -'; do
      eval 'set -- ${'$x'[${y% *}]}'
      list+=\ ${@/#/${y#* }}
    done
  done
  _arch_compgen $list
}

_arch_incomp() {
  local r="[[:space:]]-(-${1#* }[[:space:]]|[[:alnum:]_]*${1% *})"
  [[ $COMP_LINE =~ $r ]]
}

_pacman_pkg() {
  _arch_compgen "$(
    if [[ $2 ]]; then
      \pacman -$1 2>/dev/null | \cut -d' ' -f1 | \sort -u
    else
      \pacman -$1 2>/dev/null
    fi
  )"
}

_yay_pkg() {
  [ -z "$cur" ] && _pacman_pkg Slq && return
  _arch_compgen "$(yay -Pc)"
}

_pacman_repo_list() {
  _arch_compgen "$(pacman-conf --repo-list)"
}

_yay() {
  compopt -o default
  local common core cur database files prev query remove sync upgrade o
  local yays show getpkgbuild
  local cur prev words cword

  _init_completion || return
  database=('asdeps asexplicit')
  files=('list machinereadable refresh regex' 'l x y')
  query=('changelog check deps explicit file foreign groups info list native owns
          search unrequired upgrades' 'c e g i k l m n o p s t u')
  remove=('cascade dbonly nodeps assume-installed nosave print recursive unneeded' 'c n p s u')
  sync=('asdeps asexplicit clean dbonly downloadonly overwrite groups ignore ignoregroup
         info list needed nodeps assume-installed print refresh recursive search sysupgrade'
    'c g i l p s u w y')
  upgrade=('asdeps asexplicit overwrite needed nodeps assume-installed print recursive' 'p')
  core=('database files help query remove sync upgrade version' 'D F Q R S U V h')

  ##yay stuff
  common=('arch cachedir color config confirm dbpath debug gpgdir help hookdir logfile
          noconfirm noprogressbar noscriptlet quiet root verbose
          makepkg pacman git gpg gpgflags config requestsplitn sudoloop nosudoloop
          redownload noredownload redownloadall rebuild rebuildall rebuildtree norebuild
          sortby answerclean answerdiff answeredit answerupgrade noanswerclean noanswerdiff
          noansweredit noanswerupgrade cleanmenu diffmenu editmenu upgrademenu cleanafter nocleanafter
          nocleanmenu nodiffmenu noupgrademenu provides noprovides pgpfetch nopgpfetch
          useask nouseask combinedupgrade nocombinedupgrade aur repo makepkgconf
          nomakepkgconf askremovemake removemake noremovemake completioninterval aururl
          searchby batchinstall nobatchinstall'
    'b d h q r v')
  yays=('clean gendb' 'c')
  show=('complete defaultconfig currentconfig stats news' 'c d g s w')
  getpkgbuild=('force print' 'f p')

  for o in 'D database' 'F files' 'Q query' 'R remove' 'S sync' 'U upgrade' 'Y yays' 'P show' 'G getpkgbuild'; do
    _arch_incomp "$o" && break
  done

  if [[ $? != 0 ]]; then
    _arch_ptr2comp core
  elif [[ ! $prev =~ ^-[[:alnum:]_]*[Vbhr] && ! $prev == --@(cachedir|color|config|dbpath|help|hookdir|gpgdir|logfile|root|version) ]]; then
    [[ $cur == -* ]] && _arch_ptr2comp ${o#* } common ||
      case ${o% *} in
      D | R)
        _pacman_pkg Qq
        ;;
      F)
        { _arch_incomp 'l list' && _pacman_pkg Slq; } ||
          _arch_incomp 'o owns' ||
          compopt +o default
        ;;
      Q)
        { _arch_incomp 'g groups' && _pacman_pkg Qg sort; } ||
          { _arch_incomp 'p file' && _pacman_file; } ||
          { _arch_incomp 's search' && compopt +o default; } ||
          { _arch_incomp 'u upgrades' && compopt +o default; } ||
          _arch_incomp 'o owns' ||
          _pacman_pkg Qq
        ;;
      S)
        { _arch_incomp 'g groups' && _pacman_pkg Sg; } ||
          { _arch_incomp 'l list' && _pacman_repo_list; } ||
          { _arch_incomp 's search' && compopt +o default; } ||
          _yay_pkg
        ;;
      U)
        _pacman_file
        ;;
      G)
        _yay_pkg
        ;;
      esac
  fi
  true
}

_pacman_file() {
  compopt -o filenames
  _filedir 'pkg.tar*'
}

complete -F _yay yay

# ex:et ts=2 sw=2 ft=sh
